/**
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕机     永无BUG                    //
////////////////////////////////////////////////////////////////////
 * 
 * 
 * 
 * 什么是动态资源：相对静态资源(图片，css,js前端文件,) 需要访问数据库(redis mysql......).
 * 
 * url 的资源定位：我们简单把 /home/css/demo.css 我们认为这种就是 静态资源， 
 * 
 *                动态资源： ?a=index&c=index a 表示 action ，c 表示 controller
 * 
 * 
 *                             http://localhost:8080/demo.html?a=index&c=index
 * 
 *                         url: http://localhost:8080/demo.html?a=index&c=index
 * 
 *                         uri:demo.html?a=index&c=index
 * 
 *                         path:demo.html (这个path 也是开发者自己定义的,这种格式没限定 demo.html(写成 .html 为了seo ) 
 *                              也可以写 demo 也可以 demo.htm)
 * 
 *                         query: a=index&c=index 就可以理解为服务端传递参数用的，数据进行查找
 * 
 * 
 * 
 * 
 * 
 * 
 */





let http = require("http");
let fs = require("fs");
let nunjucks = require("nunjucks");

let server = http.createServer();

let session = [];

server.listen(8080);


server.on('request', function (req, res) {

    /**
     * 流方式获取数据
     */
    let postData = '';
    req.on('data', function (chunk) {//流方式读取数据，数据一段一段传输，这一段代码是异步的
        postData += chunk;
    });

    req.on('end', async function () {//表示流已经接受完毕
        console.log("流方式获取数据：：：：：");
        console.log(postData);//可以获取到数据？？why？

        /**
         * 拆分post数据
         */
        let postArr = postData.split("&");// ['name=demo','password=23'];
        let postVals = [];
        for (let ky in postArr) {
            let val = postArr[ky];//'a=index'.......
            let temPostArray = val.split("=");
            postVals[temPostArray[0]] = temPostArray[1];
        }
        //给 req 对象添加一个 query
        req.post = postVals;

        let url = req.url;
        //静态资源与动态资源判断
        //在web服务器，要尽量使用异步函数
        //web服务器给谁用的，给用户，给管理员用
        //node自身的问题，node 是单线程的.
        //404 页面
        if (url.lastIndexOf('.') > -1) {
            console.log(url);
            let path = '.' + url;
            readFileByPromise(path, res);
        } else {

            req.cookie={};//初始化cookie的值
            //取出cookie,把cookie转成 key=val 的数组
            if (req.headers.cookie) {
                let cookieStrArr = req.headers.cookie.split("; ");
                let cookies = {};//还是以json格式来存储
                cookieStrArr.forEach(element => {
                    let cookieKeyAndVal = element.split("=");
                    cookies[cookieKeyAndVal[0]] = cookieKeyAndVal[1];
                });
                // console.log('session获取到的数据');
                // console.log(cookies['demo']);
                // console.log(session[cookies['demo']]);
                req.cookie = cookies;//保存到请求对象
            }
            //console.log(req.cookie);
            //每次请求给他生成一个唯一的cookie建
            //cookie名称我们就取 node_session,我们的目标是啥？生成以后在会话期就不再设置
            //在判断里面一个字符串 是true还是false？？？？？？？它是true，'0' 你们去验证下
            let node_session=null;
            if (!req.cookie.node_session) {//没有node_session设置一个
                node_session = (new Date().getTime() + "_" + Math.random());
                res.setHeader('Set-Cookie', "node_session=" + node_session);
                req.cookie.node_session = node_session;
            } else {//有node_session
                node_session = req.cookie.node_session;
            }
            res.setHeader("Content-type", "text/html;charset=utf8");
            //根据cookie去读取session的值
            if (session[node_session]) {
                console.log('session data');
                console.log(session);
                req.session = session[node_session];
            }
            //去除query,使用split 以 demo?a=index&c=index 为例

            let queryString = url.split("?")[1];//a=index&c=index  

            let queryArr = queryString.split("&");// ['a=index','c=index'];

            let keyVals = [];
            for (let key in queryArr) {
                let vals = queryArr[key];//'a=index'.......
                let temArray = vals.split("=");
                keyVals[temArray[0]] = temArray[1];
            }

            //给 req 对象添加一个 query
            req.query = keyVals;
            console.log(keyVals['c']);
            let controllerPath = './home/controller/' + keyVals['c'].replace(keyVals[0], keyVals['c'][0].toUpperCase()) + "Controller";
            //正常的项目.controller 是由多个的，model也是有多个的,所以通过url 可动态的调用
            let controller = require(controllerPath);//controller 就是一个 class
            //console.log(keyVals['a']);
            //keyVals['a'] 变量吧,所以在json 里面，要去调用它的key ,用 .方式 key必须是个常量,
            console.log(controller);
            let action = keyVals['a'];
            let obj = new controller(req, res, nunjucks);//找控制器，然后执行控制器下的方法
            let content = await obj[action]();//我们业务逻辑
            if (res.session) {
                session[node_session] = res.session;
            }
            if(content==='301'){
                res.writeHead(301,{'location':'/?c=user&a=userList'});
                res.end();
            }else{
                res.write(content);
                res.end();
            }
            // var date = new Date(); //获取到当前时间
            // date.setTime(date.getTime() + 30 * 60 * 10000);//毫秒
            //res.setHeader('Set-Cookie', "userInfo=987654321; expires="+date.toGMTString()+"; path=/mydir;");
            
            //
        }
    })



})


let promise = function (filename) {

    return new Promise(function (resolve, reject) {

        fs.exists(filename, function (result) {
            if (!result) {
                filename = './home/imgs/404.png';
            }
            fs.readFile(filename, function (err, data) {
                resolve(data);
            })
        })
    })
}

async function readFileByPromise(fileName, res) {
    let data = await promise(fileName);
    if (data) {
        res.write(data);
    }
    res.end();
}

/*
 * h5 + css + vue + webapi 根本
 *
 *
 */


/**
 * 搭建个自己的网站，实现动态网页，与动态网页的渲染展示
 *
 * 优化 数据库的查询(使用promise) + 去了解下 js的 class
 *
 *
 */